select 在 golang 裡面是一個跟 switch 很像,但又只專屬用在 channel 的一個功能
select 功能其實蠻簡單的,如果你有多條 channel 要在一個線程,去控管它的輸出,這時侯就是運用 select 的好時機
package main
import (
"fmt"
)
var sender1Channel chan string
var sender2Channel chan string
func Sender1() {
sender1Channel <- "this is sender1"
}
func Sender2() {
sender2Channel <- "this is sender2"
}
func main() {
sender1Channel = make(chan string)
sender2Channel = make(chan string)
go Sender1()
go Sender2()
i := 0
for {
select {
case msg := <-sender1Channel:
fmt.Println(msg)
case msg := <-sender2Channel:
fmt.Println(msg)
}
//這邊因為只有兩個 sender 各送一條訊息,所以這個loop 只要執行兩次就可以 break,因為不會再有其他訊息進來
i = i + 1
if i >= 2 {
break
}
}
fmt.Println("end")
}
https://play.golang.org/p/-scW4ZbLEa5
要注意 select 到底會進入哪一條 case,外在是無法控制的,這是由 golang 內部演算法實作,所以如果 case 的情況多,的確有機會不會進到某 case 裡面。所以請斟酌使用方式。